<meta charset="utf-8">
<script type="text/javascript">
	var i=0;
	var mCheckMap = {};     //存储已扫描过的事件
	var mCheckID = 0;
	for (var k in document) {
        if (/^on./.test(k)) {
            hookEvent(k,i++)
            console.log('遍历事件: '+k+',事件ID: '+i)
        }
    }

    function hookEvent(eventName,eventID){
    	document.addEventListener(eventName.substr(2),function(e){
    		scanElement(e.target)
    	},true);

    	function scanElement(el){
    		flag=el['_k']
    		if(!flag){
    			flag=el['_k']=mCheckID++;
    		}
    		hash=(flag << 8) | eventID;
    		if(mCheckID[hash]){
    			return ;
    		}
    		mCheckID[hash]=true
    	}
    }


    function hookEvent(eventName, eventID) {
	    document.addEventListener(eventName.substr(2), function(e) {
	        scanElement(e.target);
	    }, true);

	    function scanElement(el) {
	        // 跳过已扫描的事件
	        var flag = el['_k'];
	        if (!flag){	//如果尚未扫描，分配_k，也为当前检测的数量
	            flag = el['_k'] = ++mCheckID;
	        }
	        var hash = (flag << 8) | eventID;	//获得HASH值，因为flag不会相同，所以不同对象的Hash值也不会相同
	        
	        if (hash in mCheckMap) {
	            return;
	        }
	        console.log(mCheckMap)
	        mCheckMap[hash] = true;
	    }
	}
</script>